package cn.bigcontainer.alt.meta.service;

import java.util.List;

import cn.bigcontainer.alt.meta.dto.MObjectDto;
import cn.bigcontainer.alt.meta.po.MObject;
import cn.bigcontainer.alt.meta.po.MProperty;
import cn.bigcontainer.alt.meta.po.MView;

/**
 * WOS辅助服务，实现默认crud生成、orm代码生成等辅助工具.
 * 
 * @author cailei
 * @date 2017年6月19日
 */
public interface MetaService {

	public List<MObjectDto> getObjects();

	/**
	 * 获取对象及其应用，并设置对象、属性、关系meta=true
	 * @param objectId 对象ID，不能为空
	 * @return
	 */
	public MObjectDto getObjectWithApps(String objectId);

	/**
	 * 获取对象及其应用，并根据viewId、propertyId和buttonId设置相应的元数据meta=true
	 * @param viewId 视图ID，不能为空
	 * @param propertyId 视图属性ID，可以为空
	 * @param buttonId 视图按钮ID，可以为空
	 * @return
	 */
	public MObjectDto getObjectWithApps(String viewId, String propertyId, String buttonId);

	/**
	 * @param table
	 */
	public void createDefaultCrud(String table);

	/**
	 * @param appId
	 * @return
	 */
	public String copyCrud(String appId);

	/**
	 * @param appId
	 */
	public void deleteApp(String appId);

	/**
	 * @param objId
	 */
	public void deleteObject(String objId);
	
	/**
	 * 生成po/dto/mapper/service/controller代码框架
	 * @param module
	 * @param pkg
	 * @param srcDir
	 * @param isCreate 是否第一次创建，true生成所有代码，否则仅生成po
	 */
	public void createJavaCodes(String module, String pkg, String srcDir, boolean isCreate);

	/**
	 * 生成po/dto/mapper/service/controller代码框架
	 * @param object
	 * @param pkg
	 * @param srcDir
	 * @param isCreate
	 */
	public void createJavaCode(String object, String pkg, String srcDir, boolean isCreate);

	/**
	 * 如果快速创建的对象已经存在，提示用户确认
	 * @param module
	 * @param objName 对象中文名称
	 * @return
	 */
	public boolean confirmCreateSnapShoot(String module, String objName);

	/**
	 * @param module
	 *            对象所属的模块
	 * @param objName
	 *            对象中英文名称
	 * @param propsDesc
	 *            属性和关系描述，以分号隔开；每个属性的格式如方括号中的内容所示：[名称(类型:文本,长度:200,默认值:
	 *            xxx,允许为空:是,主键:否)]或者[数量(类型:数字,范围:1/200,小数位:2,默认值:100,允许为空:否)]
	 *            ；关系的格式如方括号中的内容所示：[创建人(关联:用户,类型:多对一/继承/多对多)]或者[关联:用户,类型:多对一/继承/
	 *            多对多]；属性和关系描述中的符号中英文都支持。
	 * @return
	 */
	public MObject createMeta(String module, String objName, String propsDesc);

	/**
	 * 
	 * @param objectId
	 * @param propName 
	 * @param propDetail 属性的格式如方括号中的内容所示：[类型:文本,长度:200,默认值:
	 *            当前用户名,允许为空:是,主键:否,索引:1]或者[类型:数字,范围:1/200,小数位:2,默认值:100,允许为空:否,索引:1]
	 * @return
	 */
	public MProperty createPropertyMeta(String objectId, String propName, String propDetail);
	
	/**
	 * 
	 * @param objectId
	 * @param propName
	 * @param relationDetail 关系的格式如方括号中的内容所示：[关联:用户,类型:多对一/继承/多对多,索引:1]；
	 * 			类型为M2CM/M2C1举例，[关联:用户|用户组,类型:M2CM,索引:1]
	 * @return MRelation、关系对象MObject（如果之前不存在）、被关联对象MObject（如果之前不存在）
	 */
	public List createRelationMeta(String objectId, String propName, String relationDetail);
	
	/**
	 * @param id
	 * @param table
	 */
	public void deleteViewPropOrButton(String id, String table);
	
	/**
	 * 更新crud。如果是默认crud，则根据表进行更新；否则，根据默认crud进行更新。
	 * @param appId
	 */
	public void updateCrud(String appId);

	/**
	 *
	 * @param srcView
	 * @return
	 */
	public MView cloneView(MView srcView);

	/**
	 * 拷贝视图时，根据srcView获取视图id
	 * @param srcView
	 * @return
	 */
	public String copyViewId(MView srcView);

	/**
	 *
	 * @param id
	 * @param oldView
	 * @param newView
	 * @return
	 */
	public String copyViewPropertyOrButtonId(String id, String oldView, String newView);

	/**
	 * @param appId
	 */
	public void createEditorByCrud(String appId);
}
